/*******************************************************************************

                     LVGL输入法之拼音输入法实现
本输入法负责管理输入法软键盘接收，以及一行的选择显示，仅支持触模不支持实体按键
暂仅支持GB2312编码的汉字
拼音选择状态时如：<< ai ao au>>
汉字选择状态时如: << 啊 阿 吖 嗄 >>
*******************************************************************************/
#ifndef __LV_IME_PINYIN_H
#define __LV_IME_PINYIN_H
#include "lvIME_Base.h"
#include "PinYinIME.h"

/*******************************************************************************
                          相关配置
*******************************************************************************/
//---------------------------相关定义-------------------------------

//定义每个汉字的最小宽度，pixe为单位，以决定一页最多可多少个汉字备选
#ifndef LV_IME_PINYIN_CH_MIN_W
  #define LV_IME_PINYIN_CH_MIN_W  50
#endif

//一页能容纳的最大按钮数,受lvIME_SignBuf[]限制，最少8个，最多24个
#define LV_IME_PINYIN_BTN_MAX   20

/*******************************************************************************
                                 相关结构
*******************************************************************************/
//输入状态定义
#define LV_IME_PINYIN_WAIT_IN      0      //等待输入状态
#define LV_IME_PINYIN_PINYING_IN   1      //拼音输入状态
#define LV_IME_PINYIN_CH_SEL       2      //汉字选择状态

//拼音输入完成回调函数定义,pCh为输入完成的字符(UTF8格式)
typedef void (*lvIME_PinYin_EndCb_t)(void *pv, char *pCh);

//主结构
struct _lvIME_PinYin{
  lv_obj_t *pObj;             //负责一行的显示的软键盘
  lvIME_PinYin_EndCb_t pEndCb; //输入完成回调
  void *pvEndCb;             //输入完成回调参数
  //9键输入法专用:
  PinYinIME_t PY;             //使用的拼音输入法结构
  //26键输入法专用：
  unsigned char PinYin[8];    //保存输入的拼音字母，主要供26键输入法使用
  const char   *pCh;          //找到的汉字
  unsigned char PinYinCount;  //输入拼音字母个数
  //初始化时固定的参数:
  unsigned char IsKb26;       //是否为26键拼音,否则为9键
  unsigned char InState;      //输入状态
  unsigned char BtnMax;       //一页可容纳的最大按钮数
  //_UpdateMap()时固定的参数:
  unsigned char ContentBtnMax;   //内容可容纳的最大按钮数
  unsigned char ContentBtnCount; //当前内容的按钮数
  unsigned char HavePrvNextBtn;  //左右翻页键，b0有上一页按钮，b1有下一页按钮
  //定位拼音与汉字位置的参数：
  unsigned char PinYinStart;  //拼音显示起始位置,多个拼音显示不全时用于多页显示
  unsigned short ChStart;     //汉字显示起始位置,半字为单位
  unsigned char CurPinYin;    //当前选择的拼音字索引位置
};

/*******************************************************************************
                                 相关函数
*******************************************************************************/
//-------------------------创建拼音输入法----------------------------------
//返回是否成功！
signed char lvIME_CreatePinYin(struct _lvIME_PinYin *pPinYin,  //主结构
                              lv_obj_t *pKeyG, //已创建的输入法软键盘
                              unsigned char IsKb26,   //是否为26键拼音
                              lvIME_PinYin_EndCb_t pEndCb, //输入完成回调
                              void *pvEndCb);          //回调参数

//-------------------------软键盘按键处理函数---------------------------------
//返回0处理完成，1后撤到头部了，-1：不能识别的键值,-2拼音无效
signed char lvIME_PinYinKbKeyPro(struct _lvIME_PinYin *pPinYin,
                                unsigned char Key);

//--------------------------------删除自身-------------------------------------
void lvIME_PinYinDelete(struct _lvIME_PinYin *pPinYin);

#endif //__LV_IME_PINYIN_H
